package com.ruoyi.mobile.service.impl;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.mobile.domain.*;
import com.ruoyi.mobile.mapper.*;
import com.ruoyi.mobile.model.bo.UserPrescriptionInfoBo;
import com.ruoyi.mobile.model.request.UserPrescriptionRequest;
import com.ruoyi.mobile.model.vo.UserPrescriptionVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.mobile.service.IUserPrescriptionService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户运动处方配置Service业务层处理
 * 
 * @author ruoyi
 * @date 2022-10-14
 */
@Service
public class UserPrescriptionServiceImpl implements IUserPrescriptionService 
{
    @Autowired
    private UserPrescriptionMapper userPrescriptionMapper;


    @Autowired
    private UserPrescriptionItemMapper userPrescriptionItemMapper;

    @Autowired
    private LessonPrescriptionMapper lessonPrescriptionMapper;

    @Autowired
    private LessonPrescriptionItemMapper lessonPrescriptionItemMapper;

    @Autowired
    private LessonPrescriptionItemLessonMapper lessonPrescriptionItemLessonMapper;

    @Autowired
    private LessonPointPrescriptionMapper lessonPointPrescriptionMapper;

    @Autowired
    private LessonPointPrescriptionItemMapper lessonPointPrescriptionItemMapper;

    @Autowired
    private LessonPointPrescriptionItemLessonMapper lessonPointPrescriptionItemLessonMapper;

    /**
     * 查询用户运动处方配置
     * 
     * @param id 用户运动处方配置主键
     * @return 用户运动处方配置
     */
    @Override
    public UserPrescriptionVo selectUserPrescriptionById(Integer id)
    {
        UserPrescription userPrescription = userPrescriptionMapper.selectUserPrescriptionById(id);
        UserPrescriptionVo userPrescriptionVo = new UserPrescriptionVo();
        userPrescriptionVo.setId(id);
        userPrescriptionVo.setUserId(userPrescription.getUserId());
        userPrescriptionVo.setWeek(userPrescription.getWeek());
        userPrescriptionVo.setTrainTime(userPrescription.getTrainTime());
        userPrescriptionVo.setType(userPrescription.getType());
        userPrescriptionVo.setWeekType(userPrescription.getWeekType());
        userPrescriptionVo.setPointId(userPrescription.getPointId());


        List<UserPrescriptionVo.LessonPartBean> lessonPartBeans = new ArrayList<UserPrescriptionVo.LessonPartBean>();

        //构建LessonPartBean
        if (1 == userPrescription.getType()) {
            //标准处方
            LessonPrescription lessonPrescription = lessonPrescriptionMapper.selectLessonPrescriptionByWeek(userPrescription.getWeekType());

            userPrescriptionVo.setDesc(lessonPrescription.getDesc());
            userPrescriptionVo.setProhibition(lessonPrescription.getProhibition());
            userPrescriptionVo.setAttention(lessonPrescription.getAttention());

            for (LessonPrescriptionItem lessonPrescriptionItem : lessonPrescription.getLessonPrescriptionItems()) {
                UserPrescriptionVo.LessonPartBean lessonPartBean = new UserPrescriptionVo.LessonPartBean();
                lessonPartBean.setId(lessonPrescriptionItem.getId());
                lessonPartBean.setTitle(lessonPrescriptionItem.getTitle());
                lessonPartBean.setCover(lessonPrescriptionItem.getCover());
                lessonPartBean.setItemTime(lessonPrescriptionItem.getItemTime());

                //构建dayListBean
                List<UserPrescriptionVo.LessonPartBean.DayListBean> dayListBeans = new ArrayList<>();
                List<LessonPrescriptionItemLesson> lessonPrescriptionItemLessons = lessonPrescriptionItemLessonMapper.getListByItemId(lessonPrescriptionItem.getId());
                for (LessonPrescriptionItemLesson lessonPrescriptionItemLesson : lessonPrescriptionItemLessons) {
                    UserPrescriptionVo.LessonPartBean.DayListBean dayListBean = new UserPrescriptionVo.LessonPartBean.DayListBean();
                    dayListBean.setId(lessonPrescriptionItemLesson.getId());
                    dayListBean.setTitle(lessonPrescriptionItemLesson.getTitle());

                    List<UserPrescriptionVo.LessonPartBean.DayListBean.LessonListBean> lessonListBeans = new ArrayList<>();
                    String[] lessonIdStrList = lessonPrescriptionItemLesson.getLessonId().split(",");
                    for (String lessonId : lessonIdStrList) {
                        if("".equals(lessonId)) {
                            continue;
                        }
                        UserPrescriptionVo.LessonPartBean.DayListBean.LessonListBean lessonListBean = new UserPrescriptionVo.LessonPartBean.DayListBean.LessonListBean();
                        lessonListBean.setLessonId(lessonId);
                        lessonListBeans.add(lessonListBean);
                    }
                    dayListBean.setLessonList(lessonListBeans);
                    dayListBeans.add(dayListBean);
                }

                lessonPartBean.setDayList(dayListBeans);

                lessonPartBeans.add(lessonPartBean);
            }

            userPrescriptionVo.setLessonPart(lessonPartBeans);

        } else if (2 == userPrescription.getType()) {
            //指定分数处方
            LessonPointPrescription lessonPointPrescription = lessonPointPrescriptionMapper.selectLessonPointPrescriptionById(userPrescription.getPointId());

            userPrescriptionVo.setDesc(lessonPointPrescription.getDesc());
            userPrescriptionVo.setProhibition(lessonPointPrescription.getProhibition());
            userPrescriptionVo.setAttention(lessonPointPrescription.getAttention());

            for (LessonPointPrescriptionItem lessonPointPrescriptionItem : lessonPointPrescription.getLessonPointPrescriptionItems()) {
                UserPrescriptionVo.LessonPartBean lessonPartBean = new UserPrescriptionVo.LessonPartBean();
                lessonPartBean.setId(lessonPointPrescriptionItem.getId());
                lessonPartBean.setTitle(lessonPointPrescriptionItem.getTitle());
                lessonPartBean.setCover(lessonPointPrescriptionItem.getCover());
                lessonPartBean.setItemTime(lessonPointPrescriptionItem.getItemTime());

                //构建dayListBean
                List<UserPrescriptionVo.LessonPartBean.DayListBean> dayListBeans = new ArrayList<>();
                List<LessonPointPrescriptionItemLesson> lessonPointPrescriptionItemLessons = lessonPointPrescriptionItemLessonMapper.getListByItemId(lessonPointPrescriptionItem.getId());
                for (LessonPointPrescriptionItemLesson lessonPointPrescriptionItemLesson : lessonPointPrescriptionItemLessons) {
                    UserPrescriptionVo.LessonPartBean.DayListBean dayListBean = new UserPrescriptionVo.LessonPartBean.DayListBean();
                    dayListBean.setId(lessonPointPrescriptionItemLesson.getId());
                    dayListBean.setTitle(lessonPointPrescriptionItemLesson.getTitle());

                    List<UserPrescriptionVo.LessonPartBean.DayListBean.LessonListBean> lessonListBeans = new ArrayList<>();
                    String[] lessonIdStrList = lessonPointPrescriptionItemLesson.getLessonId().split(",");
                    for (String lessonId : lessonIdStrList) {
                        if("".equals(lessonId)) {
                            continue;
                        }
                        UserPrescriptionVo.LessonPartBean.DayListBean.LessonListBean lessonListBean = new UserPrescriptionVo.LessonPartBean.DayListBean.LessonListBean();
                        lessonListBean.setLessonId(lessonId);
                        lessonListBeans.add(lessonListBean);
                    }
                    dayListBean.setLessonList(lessonListBeans);
                    dayListBeans.add(dayListBean);
                }

                lessonPartBean.setDayList(dayListBeans);

                lessonPartBeans.add(lessonPartBean);
            }

            userPrescriptionVo.setLessonPart(lessonPartBeans);

        }
        return userPrescriptionVo;
    }

    /**
     * 查询用户运动处方配置列表
     * 
     * @param userPrescription 用户运动处方配置
     * @return 用户运动处方配置
     */
    @Override
    public List<UserPrescriptionInfoBo> selectUserPrescriptionList(UserPrescription userPrescription)
    {
        List<UserPrescriptionInfoBo> userPrescriptionInfoBos = userPrescriptionMapper.selectUserPrescriptionList(userPrescription);
        for (UserPrescriptionInfoBo userPrescriptionInfoBo : userPrescriptionInfoBos) {
            if (1 == userPrescriptionInfoBo.getType()) {
                //标准处方
                Integer lessonPrescriptionId = lessonPrescriptionMapper.getIdByWeek(userPrescriptionInfoBo.getWeekType());
                List<String> titles = lessonPrescriptionItemMapper.getTitlesByPrescriptionId(lessonPrescriptionId);
                userPrescriptionInfoBo.setTitles(titles);
            } else if (2 == userPrescriptionInfoBo.getType()) {
                //指定分数处方
                List<String> titles = lessonPointPrescriptionItemMapper.getTitlesByPrescriptionId(userPrescriptionInfoBo.getPointId());
                userPrescriptionInfoBo.setTitles(titles);
            }
        }
        return userPrescriptionInfoBos;
    }

    /**
     * 新增用户运动处方配置
     * 
     * @param UserPrescriptionRequest 用户运动处方配置
     * @return 结果
     */
    @Override
    @Transactional
    public int insertUserPrescription(UserPrescriptionRequest userPrescriptionRequest)
    {
        //先检查这一周的运动处方是否有添加过
        Integer userPrescriptionCount = userPrescriptionMapper.getUserPrescriptionByWeek(userPrescriptionRequest.getUserId(), userPrescriptionRequest.getWeek());
        if (userPrescriptionCount >= 1) {
            throw new ServiceException("这一周的运动处方已经添加过了");
        }
        UserPrescription userPrescription = new UserPrescription();
        userPrescription.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
        userPrescription.setCreateTime(DateUtils.getNowDate());
        userPrescription.setUserId(userPrescriptionRequest.getUserId());
        userPrescription.setWeek(userPrescriptionRequest.getWeek());
        userPrescription.setTrainTime(userPrescriptionRequest.getTrainTime());

        //根据type来找课程
        if (userPrescriptionRequest.getType() == 1) {
            //标准处方
            LessonPrescription lessonPrescription = lessonPrescriptionMapper.selectLessonPrescriptionByWeek(userPrescriptionRequest.getWeekType());
            userPrescription.setType(userPrescriptionRequest.getType());
            userPrescription.setWeekType(userPrescriptionRequest.getWeekType());
            userPrescriptionMapper.insertUserPrescription(userPrescription);

            List<LessonPrescriptionItem> lessonPrescriptionItemList = lessonPrescription.getLessonPrescriptionItems();
            for (LessonPrescriptionItem lessonPrescriptionItem : lessonPrescriptionItemList) {
                UserPrescriptionItem userPrescriptionItem = new UserPrescriptionItem();
                userPrescriptionItem.setItemId(lessonPrescriptionItem.getId());
                userPrescriptionItem.setPrescriptionId(userPrescription.getId());
                userPrescriptionItemMapper.insertUserPrescriptionItem(userPrescriptionItem);
            }
        } else if (userPrescriptionRequest.getType() == 2) {
            //指定分数的处方
            LessonPointPrescription lessonPointPrescription = lessonPointPrescriptionMapper.selectLessonPointPrescriptionById(userPrescriptionRequest.getPointId());
            userPrescription.setType(userPrescriptionRequest.getType());
            userPrescription.setPointId(userPrescriptionRequest.getPointId());
            userPrescriptionMapper.insertUserPrescription(userPrescription);

            List<LessonPointPrescriptionItem> lessonPointPrescriptionItemList = lessonPointPrescription.getLessonPointPrescriptionItems();
            for (LessonPointPrescriptionItem lessonPointPrescriptionItem : lessonPointPrescriptionItemList) {
                UserPrescriptionItem userPrescriptionItem = new UserPrescriptionItem();
                userPrescriptionItem.setItemId(lessonPointPrescriptionItem.getId());
                userPrescriptionItem.setPrescriptionId(userPrescription.getId());
                userPrescriptionItemMapper.insertUserPrescriptionItem(userPrescriptionItem);
            }
        } else {
            throw new ServiceException("类型选择错误");
        }
        return 1;
    }

    /**
     * 修改用户运动处方配置
     * 
     * @param UserPrescriptionRequest 用户运动处方配置
     * @return 结果
     */
    @Override
    @Transactional
    public int updateUserPrescription(UserPrescriptionRequest userPrescriptionRequest)
    {
        UserPrescription findUserPrescription = userPrescriptionMapper.selectUserPrescriptionById(userPrescriptionRequest.getId());
        if (findUserPrescription.getWeek() != userPrescriptionRequest.getWeek()) {
            //如果修改了周次，那就先检查修改后的这一周的运动处方是否有添加过
            Integer userPrescriptionCount = userPrescriptionMapper.getUserPrescriptionByWeek(userPrescriptionRequest.getUserId(), userPrescriptionRequest.getWeek());
            if (userPrescriptionCount >= 1) {
                throw new ServiceException("这一周的运动处方已经添加过了");
            }
        }
        UserPrescription userPrescription = new UserPrescription();
        userPrescription.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
        userPrescription.setCreateTime(DateUtils.getNowDate());
        userPrescription.setUserId(userPrescriptionRequest.getUserId());
        userPrescription.setWeek(userPrescriptionRequest.getWeek());
        userPrescription.setTrainTime(userPrescriptionRequest.getTrainTime());

        //找到旧的课程信息，然后删除
        userPrescriptionMapper.deleteUserPrescriptionById(userPrescriptionRequest.getId());
        userPrescriptionItemMapper.deleteByPrescriptionId(userPrescriptionRequest.getId());

        //根据type来找课程
        if (userPrescriptionRequest.getType() == 1) {
            //标准处方
            LessonPrescription lessonPrescription = lessonPrescriptionMapper.selectLessonPrescriptionByWeek(userPrescriptionRequest.getWeekType());
            userPrescription.setType(userPrescriptionRequest.getType());
            userPrescription.setWeekType(userPrescriptionRequest.getWeekType());
            userPrescriptionMapper.insertUserPrescription(userPrescription);

            List<LessonPrescriptionItem> lessonPrescriptionItemList = lessonPrescription.getLessonPrescriptionItems();
            for (LessonPrescriptionItem lessonPrescriptionItem : lessonPrescriptionItemList) {
                UserPrescriptionItem userPrescriptionItem = new UserPrescriptionItem();
                userPrescriptionItem.setItemId(lessonPrescriptionItem.getId());
                userPrescriptionItem.setPrescriptionId(userPrescription.getId());
                userPrescriptionItemMapper.insertUserPrescriptionItem(userPrescriptionItem);
            }
        } else if (userPrescriptionRequest.getType() == 2) {
            //指定分数的处方
            LessonPointPrescription lessonPointPrescription = lessonPointPrescriptionMapper.selectLessonPointPrescriptionById(userPrescriptionRequest.getPointId());
            userPrescription.setType(userPrescriptionRequest.getType());
            userPrescription.setPointId(userPrescriptionRequest.getPointId());
            userPrescriptionMapper.insertUserPrescription(userPrescription);

            List<LessonPointPrescriptionItem> lessonPointPrescriptionItemList = lessonPointPrescription.getLessonPointPrescriptionItems();
            for (LessonPointPrescriptionItem lessonPointPrescriptionItem : lessonPointPrescriptionItemList) {
                UserPrescriptionItem userPrescriptionItem = new UserPrescriptionItem();
                userPrescriptionItem.setItemId(lessonPointPrescriptionItem.getId());
                userPrescriptionItem.setPrescriptionId(userPrescription.getId());
                userPrescriptionItemMapper.insertUserPrescriptionItem(userPrescriptionItem);
            }
        } else {
            throw new ServiceException("类型选择错误");
        }

        return 1;
    }

    /**
     * 批量删除用户运动处方配置
     * 
     * @param ids 需要删除的用户运动处方配置主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteUserPrescriptionByIds(Integer[] ids)
    {
        userPrescriptionMapper.deleteUserPrescriptionByIds(ids);
        userPrescriptionItemMapper.deleteByPrescriptionIds(ids);
        return 1;
    }

}
